/**
 * 
 */
package fr.afcepf.atod21.data;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.List;

import fr.afcepf.atod21.entity.Stagiaire;
import fr.afcepf.atod21.exception.Atod21Exception;

/**
 * @see IdaoStagiaire
 * @author Stagiaire
 *
 */
public class DaoStagiaireImpl implements IDaoStagiaire {
    /**
     * DataSource pour l'acces a la BDD.
     * 'organisme_formation.'
     */

    private Atod21DataSource ds = new Atod21DataSource();
    /**
     * requete pour ajouter dans la BDD.
     */
    private final String reqAjout =
            "INSERT INTO stagiaire "
            +"(nom, prenom, adresse,date_naissance,id_organisme)"
            +"values (?,?,?,?,?)";
    /**
     * Indice du parametre pour le nom du
     * {@link Stagiaire} dans la requete
     * {@link DaoStagiaireImpl#reqAjout}.
     */
    private final int indiceNomReqAjout = 1;
    /**
     * Indice du parametre pour le prenom du
     * {@link Stagiaire} dans la requete
     * {@link DaoStagiaireImpl#reqAjout}
     */
    private final int indicePrenomReqAjout = 2;
    /**
     * Indice du parametre pour le adresse du
     * {@link Stagiaire} dans la requete
     * {@link DaoStagiaireImpl#reqAjout}.
     */
    private final int indiceAdresseReqAjout = 3;
    /**
     * Indice du parametre pour le date_naissance du
     * {@link Stagiaire} dans la requete
     * {@link DaoStagiaireImpl#reqAjout}.
     */
    private final int indiceNaissanceReqAjout = 4;
    /**
     * Indice du parametre pour le organisme du
     * {@link Stagiaire} dans la requete
     * {@link DaoStagiaireImpl#reqAjout}.
     */
    private final int indiceOrganismeReqAjout = 5;

    @Override
    public Stagiaire ajouter(Stagiaire paramStagiaire) throws Atod21Exception {
        try {
            Connection cnx = ds.getConnection();
            PreparedStatement pstmt = cnx.prepareStatement(reqAjout,
                    Statement.RETURN_GENERATED_KEYS);
            pstmt.setString(indiceNomReqAjout, paramStagiaire.getNom());
            pstmt.setString(indicePrenomReqAjout, paramStagiaire.getPrenom());
            pstmt.setString(indiceAdresseReqAjout, paramStagiaire.getAdresse());
            pstmt.setDate(indiceNaissanceReqAjout,
                    new java.sql.Date(paramStagiaire.
                            getDate_naissance().getTime()));
            if (paramStagiaire.getOrganisme() != null && paramStagiaire.getOrganisme().getId() !=0) {
                pstmt.setInt(indiceOrganismeReqAjout,
                        paramStagiaire.getOrganisme().getId());
            } else {
                pstmt.setNull(indiceOrganismeReqAjout, Types.INTEGER);
            }
            int resultSql = pstmt.executeUpdate();
            if (resultSql == 1) {
                ResultSet rs = pstmt.getGeneratedKeys();
                if (rs.next()) {
                    paramStagiaire.setId(rs.getInt(1));
                }
            }

        } catch (SQLException e) {
            throw new Atod21Exception("Erreur 10001 - DaoStagiaire-->ajouter "  + e.getMessage());

        }

        return paramStagiaire;
    }

    @Override
    public List<Stagiaire> rechercher(String paramNom) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public List<Stagiaire> rechercher(int paramIdOrganisme) {
        // TODO Auto-generated method stub
        return null;
    }


    /**
     * Requete de renvoi d'un {@link Stagiaire}.
     */
    private final String reqRenvoi="UPDATE stagiaire set id_organisme = null "
            +"where idstagiaire = ? and id_organisme = ?";
    /**
     * indice du parametre de la requete ReRenvoi.
     */
    private final int indiceIdStageRenvoi = 1;
    /**
     * indice du paramtere  de la requete reqRenvoi.
     */
    private final int indiceIdOrganismeRenvoi = 2;
    @Override
    public Stagiaire envoi(Stagiaire paramStagiaire) throws Atod21Exception {
        try {
            Connection cnx = ds.getConnection();
            PreparedStatement pstmt = cnx.prepareStatement(reqRenvoi);
            pstmt.setInt(indiceIdStageRenvoi, paramStagiaire.getId());
            pstmt.setInt(indiceIdOrganismeRenvoi, paramStagiaire.getOrganisme().getId());
            if(pstmt.executeUpdate() == 1) {
                paramStagiaire.setOrganisme(null);
            } else {
                throw new Atod21Exception(
                        "Erreur 1002 - DaoStagiaire-->renvoi "
                        + "Le stagiaire n'est pas dans cet organisme");
            }
            
        } catch (SQLException e) {
            throw new Atod21Exception("Erreur 1002 -DaoStagiaire-->renvoi" + e.getMessage());
        }
        return paramStagiaire;
    }

}
